package com.hc.controller;

import com.hc.common.bean.PageBean;
import com.hc.common.bean.Result;
import com.hc.common.bean.ResultUtil;
import com.hc.common.enums.ResultEnum;
import com.hc.common.utils.ControllerUtil;
import com.hc.domain.Author;
import com.hc.query.AuthorVO;
import com.hc.query.SearchVO;
import com.hc.res.AuthorDTO;
import com.hc.service.AuthorService;
import com.hc.trans.AuthorTrans;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.annotation.Resource;
import java.io.Serializable;

/**
 * @ClassName: Author
 * @Description: 作者模块
 * @date:2021/11/20 14:12
 * @author: zhitb
 * @Version: 1.0
 **/
@Slf4j
@Controller
@RequestMapping("/author")
public class AuthorController {
    @Resource
    private AuthorService authorService;

    /**
     * 查看作者列表
     * @param pageNum 当前页
     * @param pageSize 每页的数据量
     * @param searchVO 查找(键值对条件)
     * @param mav 返回的数据
     * @return
     */
    @GetMapping("/getAuthorByCondition/{pageNum}/{pageSize}")
    public ModelAndView getAuthorByCondition(
            @PathVariable("pageNum") Integer pageNum,
            @PathVariable("pageSize") Integer pageSize,
            SearchVO searchVO,
            ModelAndView mav,
            String s) {

        AuthorVO authorVO = new AuthorVO();
        if(!("4".equals(s))){
            authorVO.setStatus(s);
        }
        ControllerUtil.initParam(authorVO, searchVO);
        // 分页+条件 查找作者信息
        PageBean<Author> authorPageBean = authorService.selectPageByCondition(pageNum, pageSize, authorVO);
        // 转换
        PageBean<AuthorDTO> authorDTOPageBean = AuthorTrans.MAPPER.author2AuthorDTO(authorPageBean);
        // 保存分页查找路径
        authorDTOPageBean.setUrl("author/getAuthorByCondition");
        // 添加 作者列表数据
        mav.addObject("pageBean",authorDTOPageBean);
        // 返回查询条件
        mav.addObject("searchValue", searchVO.getSearchValue());
        mav.addObject("searchKey", searchVO.getSearchKey());
        mav.addObject("status",s);
        // 返回页面title标签信息
        mav.addObject("title", "作者列表");

        // 携带数据返回显示页面
        mav.setViewName("author/list");

        return mav;
    }

    /**
     * 作者详情
     * @param id 作者id
     * @param mav 返回数据
     * @return
     */
    @GetMapping("/getById/{id}")
    public ModelAndView getById(@PathVariable Serializable id, ModelAndView mav) {
        // 根据id查询作者信息
        Author author = authorService.selectByPrimaryKey(Long.parseLong(id.toString()));
        // 添加 作者详情
        mav.addObject("author", author);
        // 返回页面title标签信息
        mav.addObject("title", "作者详情");
        // 携带数据返回显示页面
        mav.setViewName("author/detail");
        return mav;
    }

    /**
     * 编辑作者信息
     * @param id 作者id
     * @param mav 返回数据
     * @return
     */
    @GetMapping("/getByIdEdit/{id}")
    public ModelAndView getByIdEdit(@PathVariable Serializable id, ModelAndView mav) {
        // 根据id查询作者信息
        Author author = authorService.selectByPrimaryKey(Long.parseLong(id.toString()));
        // 添加 作者详情
        mav.addObject("author", author);
        // 返回页面title标签信息
        mav.addObject("title", "编辑作者信息");
        // 携带数据返回显示页面
        mav.setViewName("author/update");
        return mav;
    }


    /**
     * 修改作者信息
     * @param
     * @param mav
     * @return
     */
    @GetMapping("/updateAuthor/{id}")
    public ModelAndView updateAuthor(@PathVariable long id, Author author, ModelAndView mav) {
        // 修改作者信息，返回修改的条数
        author.setId(id);
        int i = authorService.updateByPrimaryKeySelective(author);
        if(i>0){
            mav.addObject("title","作者详情");
            mav.setViewName("author/detail");
        }
        return mav;
    }

    /**
     * 删除作者信息
     * @param id 作者id
     * @return
     */
    @ResponseBody
    @DeleteMapping("/deleteAuthor/{id}")
    public Result deleteAuthor(@PathVariable Long id) {
        // SQL语句实则修改状态为2
        int deleteNum = authorService.deleteByPrimaryKey(id);
        if(deleteNum==1){
            return ResultUtil.success().setMsg("删除成功！");
        }else{
            return ResultUtil.fail(ResultEnum.ERROR);
        }

    }

    /**
     * 删除多个作者信息
     * @param id 作者id
     * @return
     */
    @ResponseBody
    @DeleteMapping("/deleteAuthors/{id}")
    public Result deleteAuthors(@PathVariable Long[] id) {
        // 删除成功的数量
        int deleteRes = 0;
        // 遍历需要删除的用户id数组
        for (int i = 0; i < id.length; i++) {
            //成功删除一次，成功数量加1
            deleteRes += authorService.deleteByPrimaryKey(id[i]);
        }
        // 删除成功的个数和需要删除的个数相同，则删除成功
        if (deleteRes == id.length) {
            return ResultUtil.success().setMsg("删除成功");
        } else {
            return ResultUtil.fail(ResultEnum.ERROR);
        }

    }

    /**
     * 添加作者
     * @param author 作者信息
     * @return
     */
    @ResponseBody
    @PostMapping("/addAuthor")
    public Result addAuthor(Author author){
        author.setStatus(0);
        int i = authorService.insertSelective(author);
        if(i==1){
            return ResultUtil.success().setMsg("添加成功！");
        }
        return ResultUtil.fail().setMsg("添加失败！");
    }
    /**
     * 批量启用作者
     *
     * @param id
     * @param mav
     * @return
     */
    @ResponseBody
    @PostMapping("/activeById/{id}")
    public Result activeById(@PathVariable("id") Long[] id, ModelAndView mav) {
        //启用成功的数量
        int deleteRes = 0;
        //遍历需要启用的项目id数组
        for (int i = 0; i < id.length; i++) {
            //成功启用一次，成功数量加1
            deleteRes += authorService.avctiveByPrimaryKey(id[i]);
        }
        //启用成功的个数和需要启用的个数相同，则启用成功
        if (deleteRes == id.length) {
            return ResultUtil.success().setMsg("启用成功");
        } else {
            return ResultUtil.success().setMsg("启用失败");
        }
    }
    /**
     * 批量禁用作者
     *
     * @param id
     * @param mav
     * @return
     */
    @ResponseBody
    @PostMapping("/disabledById/{id}")
    public Result disabledById(@PathVariable("id") Long[] id, ModelAndView mav) {
        //禁用成功的数量
        int deleteRes = 0;
        //遍历需要禁用的作者id数组
        for (int i = 0; i < id.length; i++) {
            //成功禁用一次，成功数量加1
            deleteRes += authorService.disabledByPrimaryKey(id[i]);
        }
        //启用成功的个数和需要禁用的个数相同，则启用成功
        if (deleteRes == id.length) {
            return ResultUtil.success().setMsg("禁用成功");
        } else {
            return ResultUtil.success().setMsg("禁用失败");
        }
    }
}
